package chapter13_显示锁;

/**
 * 使用tryLock避免死锁
 *
 * 休眠时间还包括固定时间和随机部分，避免活锁的产生
 */
public class LockTransfer {
//    public boolean transferMoney(Account fromAcct, Account toAcct, Double amount, long timeout, TimeUnit unit) {
//        long fixedDelay = getFixedDelayComponentNanos(timeout, unit);
//        long randMod = getRandomDelayModulesNanos(timeout, unit);
//        long stopTime = System.nanoTime() + unit.toNanos(timeout);
//
//        while (true) {
//            if (fromAcct.lock.tryLock()) {
//                try {
//                    if (toAcct.lock.tryLock()) {
//                        try {
//                            if (fromAcct.getBalance() < amount) {
//                                throw new InsufficientFundsException();
//                            } else {
//                                fromAcct.debit(amout);
//                                toAcct.credit(amount);
//                                return true;
//                            }
//                        } finally {
//                            toAcct.lock.unLock();
//                        }
//                    }
//                } finally {
//                    fromAcct.lock.unLock();
//                }
//            }
//            if (System.nanoTime() < stopTime) {
//                return false;
//            }
//            NANOSECONDS.sleep(fixedDelay + rnd.nextLong() % randMod);
//        }
//    }
}
